﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using ConexionAgente;

namespace Manager
{
    public class ServerNode
    {
        private string nombre;
        private int identificador;
        private string ramLibre;
        private string ramTotal;
        private string usoCpu;
        private string discoLibre;
        private string discoTotal;
        private string ip;
        private int puerto;
        private static int Id = 1;
        private bool vivo;
        private IServicioAgente remoto;

        public ServerNode(String ip, int puerto, String nombre)
        {
            this.ip = ip;
            this.puerto = puerto;
            this.nombre = nombre;
            this.identificador = Id++;
            init();
        }

        private void init() {
            try
            {
                String conn = "tcp://" + Ip + ":" + Puerto + "/Agente";
                //TcpChannel chan = new TcpChannel();
                //ChannelServices.RegisterChannel(chan, false);
                remoto = (IServicioAgente)Activator.GetObject(typeof(IServicioAgente), conn);
                this.vivo = true;
            }
            catch (Exception) {
                this.vivo = false;
            }
        }

        public bool Vivo
        {
            get { return vivo; }
            set { vivo = value; }
        }

        public int Identificador
        {
            get { return identificador; }
            set { identificador = value; }
        }

        public string Ip
        {
            get { return ip; }
            set { ip = value; }
        }
        public int Puerto
        {
            get { return puerto; }
            set { puerto = value; }
        }
        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        public string RamTotal
        {
            get { return ramTotal; }
            set { ramTotal = value; }
        }

        public string UsoCpu
        {
            get { return usoCpu; }
            set { usoCpu = value; }
        }

        public string DiscoLibre
        {
            get { return discoLibre; }
            set { discoLibre = value; }
        }

        public string DiscoTotal
        {
            get { return discoTotal; }
            set { discoTotal = value; }
        }

        public string RamLibre
        {
            get { return ramLibre; }
            set { ramLibre = value; }
        }
        
        public void actualizarDatos(){
            try
            {
                ramLibre = remoto.ObtenerRam().RamLibre.ToString();
                ramTotal = remoto.ObtenerRam().RamTotal.ToString();
                usoCpu = remoto.ObtenerCPU().CpuUsage.ToString();
                discoLibre = remoto.ObtenerDisco().CapacidadLibre.ToString();
                discoTotal = remoto.ObtenerDisco().CapacidadTotal.ToString();
                Console.WriteLine("Respuesta de " + Nombre + " (" + Ip + ":" + Puerto + ") recibida...");
                vivo = true;
            }
            catch {
                Console.WriteLine("El servidor " + Nombre + " (" + Ip + ":" + Puerto + ") no responde");
                vivo = false;
            }
        }

    }
}
